Common Table Expressions (CTE) হল SQL এর একটি শক্তিশালী ফিচার যা জটিল কোয়েরি লিখতে এবং পড়তে সহজ করে তোলে। CTE গুলি সাধারণত SELECT, INSERT, UPDATE, এবং DELETE কমান্ডগুলোর সাথে ব্যবহৃত হয় এবং কোয়েরির মধ্যে বা কোয়েরি নেস্টিংকে সহজ করে তোলে। CTE ব্যবহার করে কোডের পুনরাবৃত্তি কমানো এবং কোডের গঠন উন্নত করা যায়। এটি বিশেষত যখন আপনি একাধিক স্টেপে ডেটা ট্রান্সফর্ম করছেন তখন খুবই কার্যকরী।
1. CTE কী?
CTE হলো একটি নামকৃত তাত্ক্ষণিক টেবিল যা WITH কিওয়ার্ড দিয়ে SQL কোয়েরির শুরুতে ডিফাইন করা হয়। CTE টেবিলের মতো ব্যবহার করা যেতে পারে এবং এটি কোয়েরির মধ্যে একাধিকবার রেফারেন্স করা যেতে পারে। CTE কোডের গঠন পরিষ্কার এবং কমপ্যাক্ট করে তোলে, বিশেষ করে যখন আপনি একটি সাব-কোয়্যারি বা নেস্টেড কোয়েরি বারবার ব্যবহার করতে চান।
CTE এর সুবিধা:
- Code Reusability: একাধিক জায়গায় একই কোয়েরি ব্যবহার করতে পারবেন।
- Readability: কোডকে আরও পরিষ্কার এবং সহজভাবে উপস্থাপন করা যায়।
- Recursive Queries: CTE এর মাধ্যমে রিকার্সিভ কোয়েরি তৈরি করা যায়, যা হায়ারার্কিকাল ডেটার জন্য খুবই উপকারী।
2. CTE এর সিনট্যাক্স
CTE ডিফাইন করতে WITH কিওয়ার্ড ব্যবহার করা হয় এবং এরপর CTE এর নাম, কলাম নাম এবং মূল কোয়েরি দেওয়া হয়।
সাধারণ সিনট্যাক্স:
WITH CTE_Name (column1, column2, ...)
AS
(
SELECT column1, column2, ...
FROM table_name
WHERE condition
)
SELECT * FROM CTE_Name;
- CTE_Name: CTE এর নাম যা আপনি পরে কোয়েরির মধ্যে ব্যবহার করবেন।
- column1, column2, ...: CTE তে যে কলামগুলো থাকবে সেগুলোর নাম।
- SELECT: CTE তে কোয়েরি যা ডেটা রিট্রাইভ করবে।
3. CTE এর উদাহরণ
3.1. সাধারণ CTE উদাহরণ
ধরা যাক, আমাদের একটি Employees টেবিল আছে এবং আমরা একটি নির্দিষ্ট শর্তে কর্মচারীদের নাম এবং তাদের বিভাগ দেখতে চাই।
WITH EmployeeCTE AS
(
SELECT EmployeeID, FirstName, LastName, Department
FROM Employees
WHERE Department = 'Sales'
)
SELECT * FROM EmployeeCTE;
এখানে, EmployeeCTE নামক একটি CTE ডিফাইন করা হয়েছে, যা Sales বিভাগের কর্মচারীদের নির্বাচন করে এবং তারপর সেই CTE থেকে ডেটা রিট্রাইভ করা হয়েছে।
3.2. CTE ব্যবহার করে অগ্রাধিকার ভিত্তিক প্রশ্ন
ধরা যাক, আমাদের একটি Orders টেবিল আছে এবং আমরা প্রতিটি গ্রাহকের সর্বাধিক অর্ডারের ডেটা চাই।
WITH MaxOrders AS
(
SELECT CustomerID, MAX(OrderDate) AS LatestOrderDate
FROM Orders
GROUP BY CustomerID
)
SELECT o.CustomerID, o.OrderID, o.OrderDate
FROM Orders o
JOIN MaxOrders m ON o.CustomerID = m.CustomerID
AND o.OrderDate = m.LatestOrderDate;
এখানে, প্রথমে একটি CTE (MaxOrders) তৈরি করা হয়েছে, যা প্রতিটি গ্রাহকের সর্বাধিক অর্ডারের তারিখ বের করবে। তারপর মূল কোয়েরিতে সেই তথ্য ব্যবহার করে আমরা সেই সর্বাধিক অর্ডারের বিস্তারিত দেখতে পাচ্ছি।
4. Recursive CTE
Recursive CTE হল এমন একটি CTE যা নিজেকে পুনরাবৃত্তি করতে সক্ষম। এটি হায়ারার্কিকাল ডেটা (যেমন এমপ্লয়ির ম্যানেজার হায়ারার্কি, ফোল্ডার স্ট্রাকচার ইত্যাদি) নেভিগেট করতে ব্যবহার করা হয়।
সিনট্যাক্স:
WITH RecursiveCTE AS
(
-- Base Case: Start with initial row(s)
SELECT column1, column2
FROM table_name
WHERE condition
UNION ALL
-- Recursive Case: Reference the CTE itself
SELECT t.column1, t.column2
FROM table_name t
INNER JOIN RecursiveCTE r ON t.column1 = r.column2
)
SELECT * FROM RecursiveCTE;
উদাহরণ:
ধরা যাক, আমাদের একটি Employees টেবিল আছে এবং আমরা একটি হায়ারার্কিকাল কাঠামোতে কর্মচারীদের এবং তাদের ম্যানেজারদের সম্পর্ক দেখতে চাই।
WITH EmployeeHierarchy AS
(
SELECT EmployeeID, ManagerID, Name
FROM Employees
WHERE ManagerID IS NULL -- Base case: Top-level managers
UNION ALL
SELECT e.EmployeeID, e.ManagerID, e.Name
FROM Employees e
INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID -- Recursive case
)
SELECT * FROM EmployeeHierarchy;
এখানে, প্রথমে Base case এ যেসব ম্যানেজারদের ManagerID NULL (টপ-লেভেল) তাদের নির্বাচন করা হয়েছে। তারপর Recursive case এ কর্মচারীদের নির্বাচিত করা হয়েছে যারা তাদের ম্যানেজারের অধীনে কাজ করছে।
5. CTE এর সীমাবদ্ধতা
- CTE গুলি শুধুমাত্র একটি SQL কোয়েরি চলাকালীন বৈধ থাকে। একবার কোয়েরি রান হয়ে গেলে CTE টির অবস্থা শেষ হয়ে যায়।
- CTE এর মধ্যে আপনি INSERT, UPDATE, DELETE কমান্ডও ব্যবহার করতে পারেন, তবে আপনাকে সতর্ক থাকতে হবে যেন CTE এর রেকর্ডগুলিতে কোনো অনিচ্ছাকৃত পরিবর্তন না হয়।
- CTE এর মাধ্যমে খুব বড় ডেটাসেট থেকে ডেটা নির্বাচন করলে পারফরম্যান্সে প্রভাব পড়তে পারে, বিশেষত যখন এটি রিকার্সিভ হয়।
সারাংশ
CTE (Common Table Expression) SQL এর একটি শক্তিশালী বৈশিষ্ট্য যা ডেটাবেস কোয়েরি লেখার জন্য পরিষ্কার এবং ম্যানেজেবল কোড প্রদান করে। এটি সাধারণত কোডের পুনঃব্যবহার এবং ডেটা ম্যানিপুলেশনকে আরও সহজ এবং দক্ষ করে তোলে। বিশেষত, Recursive CTE ব্যবহার করে হায়ারার্কিকাল ডেটা পরিচালনা করা অনেক সহজ হয়।
Read more